package com.xiran.todoself.service;

import com.xiran.todoself.common.Response;
import com.xiran.todoself.mapper.TodoItemMapper;
import com.xiran.todoself.model.pojo.TodoItem;
import com.xiran.todoself.utils.JwtUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import sun.util.resources.LocaleData;

import javax.annotation.Resource;
import java.time.LocalDateTime;
import java.util.Date;
import java.util.List;

import static java.lang.Boolean.FALSE;
import static java.lang.Boolean.TRUE;

@Service
@Slf4j
public class TodoService {
    @Resource
    private TodoItemMapper todoItemMapper;

    public List<TodoItem> list(Long userId) {
        return todoItemMapper.listByUser(userId);
    }

    private Long currentUser() {
        String token = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes())
                .getRequest().getHeader("Authorization");
        JwtUtils jwtUtils = new JwtUtils();

        return jwtUtils.getUserId(token);
    }

    // Service 方法只需接收实体对象，userId 在内部设置
    public TodoItem add(TodoItem todoItem) {
//        // 1. 获取当前用户 ID 并设置到实体中
//        Long userId = currentUser();
//        todoItem.setUserId(userId); // 给实体对象设置 userId

        // 2. 插入数据库（此时 Mapper 只接收实体对象）
        todoItemMapper.insert(todoItem); // 调用修正后的 Mapper 方法

        // 3. 插入后，id 已自动回写到 todoItem 中，无需再查
        return todoItem; // 直接返回带 id 的实体对象
    }

    public boolean toggle(Long userId, Long id) {
        TodoItem item = todoItemMapper.findByIdAndUser(id, userId);
        if (item == null || item.getCompleted() == TRUE ) {

            return FALSE;
        }
        log.info("用户切换待办待办项状态, userId: {}, todoId: {}, 原状态: {}, 新状态: {}",
                userId, id, item.getCompleted(), !item.getCompleted());
        item.setFinishTime(LocalDateTime.now());
        return todoItemMapper.updateStatus(id, userId, !item.getCompleted(), item.getFinishTime()) > 0;
    }

    public boolean delete(Long userId, Long id) {
        return todoItemMapper.delete(id, userId) > 0;
    }
}